package cn.jmi.jmiopenatommanagementsystem.pojo;

import lombok.Data;
import org.springframework.http.HttpStatus;

/**
 * 统一响应消息封装类
 * 用于规范API接口的返回格式，包含状态码、消息和数据
 *
 * @param <T> 响应数据的泛型类型
 * @Data 注解：Lombok注解，自动生成getter、setter、toString等方法
 */
@Data
public class ResponseMessage<T> {
    /**
     * 状态码
     * 遵循HTTP状态码规范，如：200-成功，400-客户端错误，500-服务器错误
     */
    private Integer code;

    /**
     * 响应消息
     * 用于描述操作结果或错误信息
     */
    private String message;

    /**
     * 响应数据
     * 泛型类型，可以是任意类型的业务数据
     */
    private T data;

    /**
     * 全参构造函数
     * @param code 状态码
     * @param message 响应消息
     * @param data 响应数据
     */
    public ResponseMessage(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 创建错误响应（使用默认400状态码）
     * @param message 错误消息
     * @param <T> 响应数据类型
     * @return 错误响应对象
     */
    public static <T> ResponseMessage<T> error(String message) {
        return new ResponseMessage<>(HttpStatus.BAD_REQUEST.value(), message, null);
    }

    /**
     * 创建自定义响
     * @param code 自定义状态码
     * @param message 自定义消息
     * @param data 响应数据
     * @param <T> 响应数据类型
     * @return 自定义响应对象
     */
    public static <T> ResponseMessage<T> customize(Integer code, String message, T data) {
        return new ResponseMessage<>(code, message, data);
    }

    /**
     * 创建错误响应（使用自定义状态码）
     * @param code 自定义错误状态码
     * @param message 错误消息
     * @param <T> 响应数据类型
     * @return 错误响应对象
     */
    public static <T> ResponseMessage<T> error(Integer code, String message) {
        return new ResponseMessage<>(code, message, null);
    }

    /**
     * 创建成功响应
     * @param data 成功时返回的数据
     * @param <T> 响应数据类型
     * @return 成功响应对象
     */
    public static <T> ResponseMessage<T> success(T data) {
        return new ResponseMessage<>(HttpStatus.OK.value(), "success!", data);
    }

    /**
     * 创建成功响应（无数据）
     * @param <T> 响应数据类型
     * @return 成功响应对象
     */
    public static <T> ResponseMessage<T> success() {
        return new ResponseMessage<>(HttpStatus.OK.value(), "success!", null);
    }

    /**
     * 创建成功响应（自定义消息）
     * @param data 成功时返回的数据
     * @param message 自定义成功消息
     * @param <T> 响应数据类型
     * @return 成功响应对象
     */
    public static <T> ResponseMessage<T> success(T data, String message) {
        return new ResponseMessage<>(HttpStatus.OK.value(), message, data);
    }
}